package com.jzo2o.health.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.trade.dto.response.NativePayResDTO;
import com.jzo2o.api.trade.enums.PayChannelEnum;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.health.model.domain.Orders;
import com.jzo2o.health.model.dto.request.OrdersCancelReqDTO;
import com.jzo2o.health.model.dto.request.OrdersPageQueryReqDTO;
import com.jzo2o.health.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.health.model.dto.response.*;

import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author WangXinyi
 * @since 2024-12-14
 */
public interface IOrdersService extends IService<Orders> {


    /**
     * 下单接口
     *
     * @param placeOrderReqDTO
     * @return
     */
    PlaceOrderResDTO place(PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * 生成19位订单id
     *
     * @return
     */
    Long createOrderId();


    /**
     * 订单支付
     *
     * @param tradingChannel
     * @param id
     * @return
     */
    OrdersPayResDTO pay(PayChannelEnum tradingChannel, Long id);


    /**
     * 优化下单事务
     *
     * @param orders
     */
    void add(Orders orders);


    void ofPay(Long orderId, NativePayResDTO downLineTrading);


    /**
     * 查询支付结果
     *
     * @param id
     * @return
     */
    OrdersPayResDTO payResult(Long id);


    void ofPayResult(Long orderId, String transactionId);


    /**
     * 取消订单
     *
     * @param ordersCancelReqDTO
     */
    void cancle(OrdersCancelReqDTO ordersCancelReqDTO);


    /**
     * 未支付取消订单操作
     *
     * @param orderId
     * @param cancelReason
     * @param isPeople
     */
    void cancelForNoPay(Long orderId, String cancelReason, Boolean isPeople);


    /**
     * 订单退款
     *
     * @param ordersCancelReqDTO
     */
    void refund(OrdersCancelReqDTO ordersCancelReqDTO);

    /**
     * 分页查询订单
     *
     * @param ordersPageQueryReqDTO
     * @return
     */
    PageResult<OrdersResDTO> pageQuery(OrdersPageQueryReqDTO ordersPageQueryReqDTO);

    /**
     * 根据状态统计数量
     */
    OrdersCountResDTO countByStatus();

    /**
     * 根据订单id查询
     * @param id
     * @return
     */
    AdminOrdersDetailResDTO aggregation(Long id);


    /**
     * 滚动分页查询
     * @param ordersStatus
     * @param sortBy
     * @return
     */
    List<OrdersResDTO> userPageQuery(Integer ordersStatus, Long sortBy);


    /**
     * 根据订单id查询
     * @param id
     * @return
     */
    OrdersDetailResDTO detail(Long id);
}
